package com.flc.gateway.codc;

import com.flc.gateway.model.Message;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

/**
 * @author haizi
 * @date 2018/1/1
 */
public class MessageDecoder extends ByteToMessageDecoder {

    private static int BASE_LENGTH = 10;
    private static int BAOTOU = 32523523;

    @Override
    protected void decode(ChannelHandlerContext ctx, ByteBuf buf, List<Object> out) throws Exception {


        // 判断可读长度是不是大于基本长度，不大于一定不完整
        if (buf.readableBytes() > BASE_LENGTH) {
            int beginIndex;

            while (true) {
                // 包头开始游标点
                beginIndex = buf.readerIndex();
                // 标记初始读游标位置
                buf.markReaderIndex();

                if (buf.readInt() == BAOTOU) {
                    break;
                }
                // 未读到包头标识略过一个字节
                buf.resetReaderIndex();
                buf.readByte();

                // 不满足基本长度
                if(buf.readableBytes() < BASE_LENGTH){
                    return ;
                }
            }

            short module = buf.readShort();
            int length = buf.readInt();

            if(buf.readableBytes() < length) {
                // 还原读指针
                buf.readerIndex(beginIndex);
                return;
            }

            byte[] data = new byte[length];
            buf.readBytes(data);

            Message message = new Message();
            message.setModule(module);
            message.setData(data);

            out.add(message);
        }
        //数据包不完整，需要等待后面的数据来后面一起处理
        return ;
    }
}
